﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Globalization;

namespace StandAlone
{
    public partial class frm_Ventas : Form
    {
        CultureInfo us = new CultureInfo("en-US");
        public frm_Ventas()
        {
            InitializeComponent();
        }

        private void frm_Ventas_Load(object sender, EventArgs e)
        {
            txt_Total.Text = (0).ToString();
            txt_Fecha.Text = DateTime.Today.ToString("dd/MM/yyyy");
            Funciones.Cargar_Combo("SELECT Id_Cliente,(Nombre + ' ' + Apellido) AS Nombre_Completo FROM Clientes WHERE Eliminado = 'FALSE'", 
                "Id_Cliente", "Nombre_Completo", ref cmb_Clientes);
            Funciones.Cargar_Combo("SELECT Id_Articulo,(Articulos.Articulo + ' ' + Marcas.Marca) AS Articulo_Completo FROM Articulos INNER JOIN Marcas ON Articulos.Id_Marca = Marcas.Id_Marca WHERE Articulos.Eliminado = 'FALSE'",
                "Id_Articulo", "Articulo_Completo", ref cmb_Articulo_A_Vender);
            Cargar_Txt_Nro_Factura();
            txt_Usuario.Text = frm_Menu.Nombre_Usuario.ToString();
        }

        private void Cargar_Txt_Nro_Factura()
        {
            int Nro_Factura;
            DataSet ds = new DataSet();
            ds = Funciones.Read_DataBase("SELECT MAX(Nro_Factura) as Nro_factura FROM Facturas");
            if (ds.Tables[0].Rows[0]["Nro_factura"].ToString() == "")
            {
                Nro_Factura = 1;
            }
            else
            {
                Nro_Factura = Convert.ToInt32(ds.Tables[0].Rows[0]["Nro_factura"].ToString());
                Nro_Factura++;
            }
            txt_Nro_Factura.Text += Nro_Factura.ToString().PadLeft(6,'0');
        }

        private void btn_Cancelar_Click(object sender, EventArgs e)
        {
            Limpiar_Factura(sender, e);
            txt_Total.Text = (0).ToString();
        }
       
        private void Limpiar_Factura(object sender, EventArgs e)
        {
            cmb_Clientes.SelectedIndex = -1;
            cmb_Articulo_A_Vender.SelectedIndex = -1;
            cmb_Articulos_Cargados_ID.SelectedIndex = -1;
            cmb_Articulos_Cargados_ID.Items.Clear();
            txt_Cantidad_A_Vender.Clear();
            txt_Cantidad_Seleccionado.Clear();
            txt_PU.Clear();
            txt_PU_Seleccionado.Clear();
            txt_Stock_Disponible.Clear();
            txt_SubTotal_Seleccionado.Clear();
            txt_Total.Clear();
            txt_Articulo_Seleccionado.Clear();
        }


        private void cmb_Articulo_A_Vender_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmb_Articulo_A_Vender.SelectedIndex != -1)
            {
                DataSet ds = new DataSet();
                string Id_Articulo = cmb_Articulo_A_Vender.SelectedValue.ToString();
                string Consulta = "SELECT Articulos.Stock AS Stock, Articulos.PrecioUnitario AS Pu FROM Articulos WHERE Articulos.Id_Articulo = '" +
                    Id_Articulo + "'";
                ds = Funciones.Read_DataBase(Consulta);
                txt_Stock_Disponible.Text = ds.Tables[0].Rows[0]["Stock"].ToString();
                txt_PU.Text = ds.Tables[0].Rows[0]["Pu"].ToString();
            }
        }

        private void btn_Agregar_Click(object sender, EventArgs e)
        {
            if(cmb_Articulo_A_Vender.SelectedIndex != -1)
            {
                if (txt_Cantidad_A_Vender.Text.Trim() != "")
                {
                    if (Convert.ToInt32(txt_Stock_Disponible.Text) >= Convert.ToInt32(txt_Cantidad_A_Vender.Text))
                    {
                        if (Convert.ToInt32(txt_Cantidad_A_Vender.Text) > 0)
                        {
                            if (!(cmb_Articulos_Cargados_ID.FindStringExact(cmb_Articulo_A_Vender.SelectedValue.ToString().Trim()) != -1))
                            {
                                ComboBoxItem item = new ComboBoxItem(cmb_Articulo_A_Vender.SelectedValue.ToString(), Convert.ToInt32(txt_Cantidad_A_Vender.Text));
                                cmb_Articulos_Cargados_ID.Items.Add(item);
                                cmb_Articulos_Cargados_ID.SelectedIndex = cmb_Articulos_Cargados_ID.Items.Count - 1;
                                Limpiar_Articulos_A_Agregar();
                            }
                            else
                            {
                                MessageBox.Show("Ya se vendió este Artículo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                cmb_Articulo_A_Vender.SelectedIndex = -1;
                                txt_Cantidad_A_Vender.Text = "";
                                txt_PU.Text = "";
                                txt_Stock_Disponible.Text = "";
                            }
                        }
                        else
                        {
                            MessageBox.Show("La Cantidad Ingresada no es Correcta", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Stock insuficiente para realizar la venta", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        txt_Cantidad_A_Vender.Text = "";
                    }
                }
                else
                {
                    MessageBox.Show("Ingrese una Cantidad", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("Ingrese un Artículo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void Limpiar_Articulos_A_Agregar()
        {
            cmb_Articulo_A_Vender.SelectedIndex = -1;
            txt_Cantidad_A_Vender.Clear();
            txt_PU.Clear();
            txt_Stock_Disponible.Clear();
        }

        private void cmb_Articulos_Cargados_ID_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmb_Articulos_Cargados_ID.SelectedIndex != -1)
            {
                int selectedValue = ((ComboBoxItem)cmb_Articulos_Cargados_ID.SelectedItem).Value;
                txt_Cantidad_Seleccionado.Text = selectedValue.ToString();
                DataSet ds = new DataSet();
                string Id_Articulo = cmb_Articulos_Cargados_ID.SelectedItem.ToString();
                string Consulta = "SELECT (Articulos.Articulo + ' ' + Marcas.Marca) AS Articulo,"
                    + " Articulos.PrecioUnitario FROM Articulos INNER JOIN Marcas ON"
                    + " Articulos.Id_Marca = Marcas.Id_Marca WHERE Articulos.Id_Articulo = '" +
                    Id_Articulo + "'";
                ds = Funciones.Read_DataBase(Consulta);
                txt_Articulo_Seleccionado.Text = ds.Tables[0].Rows[0].ItemArray[0].ToString();
                txt_PU_Seleccionado.Text = ds.Tables[0].Rows[0].ItemArray[1].ToString(); 
                Decimal uno, dos, tres;
                uno = Convert.ToDecimal(txt_Cantidad_Seleccionado.Text);
                dos = Convert.ToDecimal(txt_PU_Seleccionado.Text);
                txt_SubTotal_Seleccionado.Text = (uno*dos).ToString();
                tres = Convert.ToDecimal(txt_Total.Text);
                if ((cmb_Articulo_A_Vender.Text != "") && (cmb_Articulos_Cargados_ID.Text != ""))
                {
                    if (cmb_Articulos_Cargados_ID.FindStringExact(cmb_Articulo_A_Vender.SelectedItem.ToString()) != 1)
                    {
                        txt_Total.Text = (tres + (uno * dos)).ToString();

                    }    
                }
            }
        }

        private void txt_Cantidad_A_Vender_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
            if ((e.KeyChar >= 48) && (e.KeyChar <= 57))
                e.Handled = false;
            if (e.KeyChar == 8)
                e.Handled = false;
        }

        private void btn_Aceptar_Click(object sender, EventArgs e)
        {
            if (Convert.ToDecimal(txt_Total.Text) != 0)
            {
                if (cmb_Clientes.SelectedIndex != -1)
                {
                    DataSet ds;
                    string Id_Cliente = cmb_Clientes.SelectedValue.ToString();
                    //INSERTAR FACTURA
                    //string consulta1 = "INSERT INTO Facturas (Nro_Factura, Id_Cliente, usr, Total)"
                    //      + " SELECT" + "'" + txt_Nro_Factura.Text.ToString() + "', " + "'" + Id_Cliente + "', "
                    //      + "'" + txt_Usuario.Text.ToString() + "', " + Convert.ToDecimal(txt_Total.Text, us);
                    string consulta1 = "INSERT INTO Facturas (Nro_Factura, Id_Cliente, usr, Total)"
                          + " SELECT" + "'" + txt_Nro_Factura.Text.ToString() + "', " + "'" + Id_Cliente + "', "
                          + "'" + txt_Usuario.Text.ToString() + "', " + "'" + txt_Total.Text.ToString().Replace(',', '.') + "'";
                    Funciones.Insert_DataBase(consulta1);
                    //INSERTAR FACTURA_DETALLE
                    int contlinea = 1;
                    foreach (ComboBoxItem item in cmb_Articulos_Cargados_ID.Items)
                    {
                        ds = new DataSet();
                        string Id_Articulo = item.Name.ToString();
                        int Cantidad = item.Value;
                        Decimal Pu;
                        // averiguar PU
                        string consulta2 = "SELECT Articulos.PrecioUnitario as PU FROM"
                            + " Articulos WHERE Articulos.Id_Articulo = '" +
                            Id_Articulo + "'";
                        ds = Funciones.Read_DataBase(consulta2);
                        Pu = Convert.ToDecimal(ds.Tables[0].Rows[0]["PU"].ToString());
                        //fin
                        string consulta3 = "INSERT INTO Facturas_Detalle (Nro_Factura, Nro_Linea,"
                            + " Id_Articulo, Cantidad, PrecioUnitario)"
                            + " SELECT " + "'" + txt_Nro_Factura.Text.ToString() + "'" + ", " + contlinea
                            + ", " + "'" + Id_Articulo + "'" + ", " + "'" + Cantidad + "'" + ", "
                            + "'" + Pu.ToString().Replace(',', '.') + "'";
                        Funciones.Insert_DataBase(consulta3);
                        contlinea++;
                    }
                    MessageBox.Show("Factura Realizada con Éxito", "Facturar", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                    //Mostrar Factura
                    frm_Facturas.Nro_Factura = txt_Nro_Factura.Text;
                    frm_Facturas ff = new frm_Facturas();
                    ff.ShowDialog();

                    txt_Nro_Factura.Clear();
                    Cargar_Txt_Nro_Factura();

                    Limpiar_Factura(sender, e);
                    txt_Total.Text = (0).ToString();
                }
                else
                {
                    MessageBox.Show("No hay ningún cliente seleccionado, si no desea asentar el"
                        + " cliente, busque el cliente anónimo", "Error"
                        , MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            else
            {
                MessageBox.Show("No hay ningún artículo seleccionado", "Error"
                        , MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void btn_Cerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

